/**
 * @desc 函数防抖
 * 就是指触发事件后在 n 秒内函数只能执行一次，如果在 n 秒内又触发了事件，则会重新计算函数执行时间
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行，false 表非立即执行
 */
export const debounce = function (func, wait, immediate) {
	let timeout;

	return function () {
		let context = this;
		let args = arguments;

		if (timeout) clearTimeout(timeout);
		if (immediate) {
			var callNow = !timeout;
			timeout = setTimeout(() => {
				timeout = null;
			}, wait)
			if (callNow) func.apply(context, args)
		}
		else {
			timeout = setTimeout(function () {
				func.apply(context, args)
			}, wait);
		}
	}
}



/**
 * 节流（throttle）
 * 就是指连续触发事件但是在 n 秒中只执行一次函数
 * @param {*} func 
 * @param {*} wait 
 */
export const throttle = function (func, wait) {
	let previous = 0;
	return function () {
		let now = Date.now();
		let context = this;
		let args = arguments;
		if (now - previous > wait) {
			func.apply(context, args);
			previous = now;
		}
	}
}